﻿// See https://aka.ms/new-console-template for more information
//过滤器模式是一众结构型设计模式，他允许开发人员使用不同的标准（或过滤）来过滤一组对象，从而以一种灵活的方式实现对象集合的筛选和排序
//在该模式中，有一个过滤器接口，包含了过滤器方法。根据不同的需求，可以创建不同的过滤器实现类，来筛选出满足特定条件的对象。这些过滤器实现类可以通过逻辑操作组合起来，形成一个复杂的过滤器链。在实际应用中，过滤器模式可以用来过滤数据，日志，用户等。
List<Car> cars = new List<Car>()
{
    new Car(){Brand="Audi",Model="a4",Features=new List<string>(){"11","22","33"}},
    new Car(){Brand="BMW",Model="x5",Features=new List<string>(){"111","222","333"}},
    new Car(){Brand="Audi",Model="s-class",Features=new List<string>(){"1","2","3"}},
};

//根据商品名称过滤
ICarFilter brandFilter = new BrandFilter("Audi");
var car1 = brandFilter.Filter(cars);

//再根据特征来过滤
ICarFilter featureFilter = new FeatureFilter("1");
car1 = featureFilter.Filter(car1);

foreach (var item in car1)
{
    Console.WriteLine(item.Brand);
    Console.WriteLine(item.Model);
    Console.WriteLine(item.Features.Count);
}

//定义一个ICarFilter接口,其中有一个Filter方法，用于对汽车进行筛选
internal interface ICarFilter
{
    List<Car> Filter(List<Car> cars);
}

//定义汽车类，包括汽车的属性

internal class Car
{
    public string Brand { get; set; }
    public string Model { get; set; }
    public List<string> Features { get; set; }
}

//BrandFilter类，用于根据品牌筛选汽车
internal class BrandFilter : ICarFilter
{
    private string brand;

    public BrandFilter(string brand)
    {
        this.brand = brand;
    }

    public List<Car> Filter(List<Car> cars)
    {
        return cars.Where(car => car.Brand == brand).ToList();
    }
}

//BrandFilter类，用于根据品牌筛选汽车
internal class FeatureFilter : ICarFilter
{
    private string feature;

    public FeatureFilter(string feature)
    {
        this.feature = feature;
    }

    public List<Car> Filter(List<Car> cars)
    {
        return cars.Where(car => car.Features.Contains(feature)).ToList();
    }
}